package com.lx.apk.encrypt.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 *
 * date 2020/8/7.
 * description： dx 工具类，主要将jar转化为dex
 */
public class DxUtils {
    /**
     * 解压arr并将jar转化为 dex
     *
     * @param srcFile
     * @param dstFile
     */
    public static void jar2Dex(File srcFile, File dstFile) {
        if (srcFile == null || !srcFile.exists()) {
            LogUtils.e("shuck arr file not exist");
            return;
        }
        // 解压apk到指定文件夹
        ZipUtils.unZip(srcFile, dstFile);

        // 获取所有的jar
        File[] jarFiles = dstFile.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File file, String s) {
                // 提取所有的.dex文件
                return s.endsWith(".jar");
            }
        });

        if (jarFiles == null || jarFiles.length <= 0) {
            LogUtils.i("this arr is invalidate");
            return;
        }
        // 一般情况下这个壳arr中只会有一个classes.jar文件，这里classes_jar就是classes.jar文件
        File classes_jar = jarFiles[0];
        // 将classes_jar 转为为 classes.dex
        File dstDex = new File(classes_jar.getParent() + File.separator + "classes.dex");
        // 使用 android tools 里面的dx.bat 命令将 jar 转化为 dex
        dxCommand(classes_jar, dstDex);
        // 拷贝arr中的classes.dex 到 apk/temp 目录中
        File copyDstFile = new File("Encrypt/source/apk/temp/classes.dex");
        FileUtils.copyFile(dstDex, copyDstFile);
    }


    private static void dxCommand(File jarFile, File dexFile) {
        // 这里使用的是dx.bat的绝对路径.请根据实际情况填写。
        String command = "cmd.exe /C E:\\development_tools\\android_sdk\\android_sdk\\build-tools\\29.0.2\\dx --dex --output=" + dexFile.getAbsolutePath()
                + " " + jarFile.getAbsolutePath();
        CmdUtils.execCommand(command);
    }
}
